home *** CD-ROM | disk | FTP | other *** search
/ The Arsenal Files 4 / The Arsenal Files 4 (Arsenal Computer).ISO / casm / au116-as.exe / MAIN.CPP < prev    next >
C/C++ Source or Header  |  1994-12-12  |  15KB  |  486 lines

  1. // MAIN.CPP                                  1          1    6666
  2. // Dave Harris                                11         11   6
  3. // Compiled using Borland C++ ver 3.1       1 1        1 1   6666
  4. // 03-03-94                                  1     ..   1   6   6
  5. //                                           11111 .. 11111  666
  6. ////////////////////////////////////////////////////////////////////////
  7.  
  8. #include "au.hpp"
  9.  
  10. AU *glob_au;
  11.  
  12. /*░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░*/
  13. static void heapProblem()
  14. {
  15.     printf("Out of Memory\n");
  16.     exit(1);
  17. }
  18. /*░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░*/
  19. static void clean_up(void)
  20. {
  21.     fix_flist(glob_au, NULL, NULL);    /* Flush Remainder */
  22.  
  23.     cd(glob_au, glob_au->old_dest_dir);
  24.     cd(glob_au, glob_au->old_source_dir);
  25.     cd(glob_au, glob_au->cur_directory);
  26.  
  27.     if (glob_au->info != NULL)
  28.         delete glob_au->info;
  29.     delete glob_au;
  30. }
  31. /*░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░*/
  32. void ReadGlobalCFGInfo(AU *au, char *cfg_file, char *option, void (*func)(AU *, CFG_HANDLE *))
  33. {
  34.     char string[200],
  35.          string2[200];
  36.     CFG_HANDLE cfg_handle;
  37.     int type = 0;
  38.     int done_global = FALSE;
  39.  
  40.  
  41.     if (cfg_handle.open(au, cfg_file) < 0)
  42.     {
  43.         au_printf_error(au, "Can't open configuration file: %s", cfg_file);
  44.         exit(1);
  45.     }
  46.     for(EVER)
  47.     {
  48.         if (cfg_handle.read_line(au, string)==EOF)
  49.             break;
  50.  
  51.         split_string(string, string2);
  52.         if (string2[0] == '\0')
  53.             continue;
  54.  
  55.         ltrim(string);
  56.         rtrim(string);
  57.  
  58.         strcpy(au->curOpt, string2);
  59.         au->curVal = string;
  60.         switch (toupper(string2[1]) << 8 | toupper(string2[0]))
  61.         {
  62.             case 'AC':                                          // Action_log
  63.                 get_full_file_name(au, au->action_log, string);
  64.                 break;
  65.             case 'AR':
  66.                 if (stricmp(string2,"arc_path")==0)
  67.                     au->package[type].arc_path = string_save(au, string);
  68.                 else if (stricmp(string2,"arc_no_path")==0)
  69.                     au->package[type].arc_no_path = string_save(au, string);
  70.                 else
  71.                     au->package[type].arc = string_save(au, string);
  72.                 break;
  73.             case 'BE':                                          // Begin
  74.                 if (stricmp(string, "GLOBAL")==0)
  75.                     done_global = TRUE;
  76.                 else if (stricmp(string, option)!=0)
  77.                 {
  78.                     for(EVER)
  79.                     {
  80.                         if (cfg_handle.read_line(au, string)==EOF)
  81.                             return;
  82.                         split_string(string, string2);
  83.                         if (stricmp(string2,"begin")==0)
  84.                         {
  85.                             if (stricmp(string, option)==0)
  86.                             {
  87.                                 /* Just in case somebody throws in an illegal section */
  88.                                 if (func != NULL)
  89.                                     func(au, &cfg_handle);
  90.  
  91.                                 if (done_global)
  92.                                     return;
  93.                                 else
  94.                                     break;
  95.                             }
  96.                             else if (stricmp(string, "GLOBAL")==0)
  97.                             {
  98.                                 done_global = TRUE;
  99.                                 break;
  100.                             }
  101.                         }
  102.                     }
  103.                 }
  104.                 else
  105.                 {
  106.                     func(au, &cfg_handle);
  107.                     return;
  108.                 }
  109.                 break;
  110.             case 'BR':
  111.                 au->package[type].break_err = atoi(string);
  112.                 break;
  113.             case 'CR':
  114.                 au->package[type].crc = atoi(string);
  115.                 break;
  116.             case 'DE':                                          // Description
  117.                 if (stricmp(string2, "description") == 0)
  118.                     safe_string_copy(au->description, string, DESC_SIZE, TRUE);
  119.                 else if (stricmp(string2, "desc_file") == 0)
  120.                     safe_string_copy(au->desc_file, string, FILE_SIZE, TRUE);
  121.                 else if (stricmp(string2, "default_file_spec") == 0)
  122.                     au->def_file_spec = string_save(au, string);
  123.                 else
  124.                     au->package[type].del = string_save(au, string);
  125.                 break;
  126.             case 'EX':
  127.                 strcpy(au->package[type].extension, string);
  128.                 break;
  129.             case 'FI':                                          // File_list
  130.                 if (stricmp(string2, "FILE_LIST_LOG")==0)
  131.                     get_full_file_name(au, au->flist_log, string);
  132.                 else
  133.                 {
  134.                     split_string(string, string2);
  135.                     if (stricmp(string2, "+append")==0)
  136.                     {
  137.                         split_string(string, string2);
  138.                         add_to_flist(au, string2, TRUE);
  139.                     }
  140.                     else
  141.                         add_to_flist(au, string2, FALSE);
  142.                 }
  143.                 break;
  144.             case 'FO':
  145.                 if (stricmp(string,"OPUS")==0)
  146.                     au->force_mode = OPUS;
  147.                 else if (stricmp(string,"RBBS")==0)
  148.                     au->force_mode = RBBS;
  149.                 else if (stricmp(string,"GT")==0)
  150.                     au->force_mode = GT;
  151.                 else
  152.                 {
  153.                     au_printf_error(au, "Unknown File Type '%s'\n", string);
  154.                     exit(1);
  155.                 }
  156.                 break;
  157.             case 'HE':
  158.                 split_string(string, string2);
  159.                 if (strcmp(string2, "<")==0)
  160.                     au->package[type].header_method = HEADER_RED;
  161.                 else if (strcmp(string, "@") == 0)
  162.                     au->package[type].header_method = HEADER_AT;
  163.                 else
  164.                     au->package[type].header_method = HEADER_FILE;
  165.                 au->package[type].header = string_save(au, string);
  166.                 break;
  167.             case 'ME':
  168.                 au->package[type].memoryNeeded = atoi(string);
  169.                 break;
  170.             case 'OU':
  171.                 if (!strstr(string,":") && !strstr(string,"\\"))
  172.                 {
  173.                     strcpy(au->output, au->cur_directory);
  174.                     append_backslash(au->output);
  175.                 }
  176.                 strcat(au->output, string);
  177.                 break;
  178.             case 'OV':
  179.                 if (stricmp(string2, "OVERWRITE") == 0)
  180.                     au->package[type].overwrite = string_save(au, string);
  181.                 else
  182.                     au->package[type].overwrite_int_check =
  183.                         get_value(au, OFF | ON);
  184.                 break;
  185.             case 'PR':                                          // Problem_Log
  186.                 get_full_file_name(au, au->problem_log, string);
  187.                 break;
  188.             case 'RE':                                          // Retest
  189.                 au->retest = get_value(au, OFF | ON);
  190.                 break;
  191.             case 'SC':                                          // Scanner
  192.                 if (stricmp(string2, "SC_NOVIRUS_ERRORLEVEL") == 0)
  193.                     au->SC_NoVirus_EL = atoi(string);
  194.                 else if (stricmp(string2, "SC_VIRUS_ERRORLEVEL") == 0)
  195.                     au->SC_Virus_EL = atoi(string);
  196.                 else if (stricmp(string2, "SC_MEMORY_NEEDED") == 0)
  197.                     au->scannerMemNeeded = atoi(string);
  198.                 else
  199.                     strcpy(au->scanner, string);
  200.                 break;
  201.             case 'SM':
  202.                 au_printf_error(au, "Version 1.13 or below Config file!");
  203.                 exit(1);
  204.             case 'ST':
  205.                 au->package[type].strict_ext = get_value(au, OFF | ON);
  206.                 break;
  207.             case 'TY':                                          // Type
  208.                 type = atoi(string);
  209.                 break;
  210.             case 'TE':                                          // Test
  211.                 au->package[type].test = string_save(au, string);
  212.                 break;
  213.             case 'UN':
  214.                 if (stricmp(string2,"unarc_path")==0)
  215.                     au->package[type].unarc_path = string_save(au, string);
  216.                 else if (stricmp(string2,"unarc_no_path")==0)
  217.                     au->package[type].unarc_no_path = string_save(au, string);
  218.                 else if (stricmp(string2, "unarc_partial") == 0)
  219.                     au->package[type].unarc_partials = get_value(au, OFF | ON);
  220.                 else
  221.                     au->package[type].unarc = string_save(au, string);
  222.                 break;
  223.             case 'WH':
  224.                 if (stricmp(string2, "whatis_err") == 0)
  225.                     au->package[type].whatis_err = atoi(string);
  226.                 else
  227.                     au->package[type].whatis_color = atoi(string);
  228.                 break;
  229.             case 'YE':
  230.                 au->package[type].yes_queries = string_save(au, string);
  231.                 break;
  232.             case '#I':
  233.                 ReadGlobalCFGInfo(au, string, option, func);
  234.                 break;
  235.             default:
  236.                 cfg_handle.invalid_option(au, string2);
  237.         }
  238.     }
  239. }
  240. /*░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░*/
  241. /* Parse the command line parameters */
  242.  
  243. static void parse_comm_line(AU *au, int argc, char *argv[])
  244. {
  245.     char *cur_argv;
  246.     char string[128];
  247.  
  248.     for (int i=0; i<argc; i++)
  249.     {
  250.         strcpy(string, argv[i]);
  251.         subst_environ(au, string);
  252.         cur_argv=string;
  253.         if (cur_argv[0]=='-' || cur_argv[0]=='/')   /* dash option */
  254.         {
  255.             char option = toupper(cur_argv[1]);
  256.  
  257.             if (option == '-' || option == '/')
  258.                 break;
  259.  
  260.             if (option == 'S')
  261.             {
  262.                 argv[i][0] = '\0';
  263.                 if (toupper(cur_argv[2]) == 'D')
  264.                 {
  265.                     if (cur_argv[3] == '\0')
  266.                         au->sub_dirs = 50;
  267.                     else
  268.                         au->sub_dirs = atoi(cur_argv+3);
  269.                 }
  270.                 else if (toupper(cur_argv[2]) == 'E')
  271.                     au->show_execute = TRUE;
  272.                 else
  273.                     au->simulate = TRUE;
  274.             }
  275.             else if (option == 'Z')
  276.             {
  277.                 argv[i][0] = '\0';
  278.                 au->debug = TRUE;
  279.             }
  280.             else if (option == 'N' && toupper(cur_argv[2])=='E')
  281.             {
  282.                 argv[i][0] = '\0';
  283.                 au->no_extra = TRUE;
  284.             }
  285.             else if (option == 'N' && toupper(cur_argv[2]) == 'C')
  286.             {
  287.                 argv[i][0] = '\0';
  288.                 au->colorized = FALSE;
  289.             }
  290.             else if (option == 'O' || option == 'C')
  291.             {
  292.                 argv[i][0] = '\0';
  293.                 if (cur_argv[2]=='\0')    /* parameter continues on next */
  294.                 {
  295.                     strcpy(string, argv[++i]);
  296.                     subst_environ(au, string);
  297.                     cur_argv=string;
  298.                 }
  299.                 else
  300.                     cur_argv+=2;           /* advance it 2 characters */
  301.                 switch (option)
  302.                 {
  303.                     case 'C':
  304.                         strcpy(au->cfg_file, cur_argv);
  305.                         break;
  306.                     case 'O':
  307.                         if (!strstr(cur_argv,":") && !strstr(cur_argv,"\\"))
  308.                         {
  309.                             strcpy(au->output, au->cur_directory);
  310.                             append_backslash(au->output);
  311.                         }
  312.                         strcat(au->output, cur_argv);
  313.                         break;
  314.                 }
  315.                 argv[i][0] = '\0';
  316.             }
  317.             else if (option == 'F')
  318.             {
  319.                 au->flist_pos = 0;
  320.                 if (cur_argv[2] == '+')
  321.                     add_to_flist(au, cur_argv+3,TRUE);    // Func checks for dupes
  322.                 else
  323.                     add_to_flist(au, cur_argv+2,FALSE);
  324.                 argv[i][0] = '\0';
  325.             }
  326.             else if (option == 'E')
  327.             {
  328.                 argv[i][0] = '\0';
  329.                 if (cur_argv[2]=='\0')    /* parameter continues on next */
  330.                 {
  331.                     strcpy(string, argv[++i]);
  332.                     subst_environ(au, string);
  333.                     cur_argv=string;
  334.                 }
  335.                 else
  336.                     cur_argv+=2;           /* advance it 2 characters */
  337.                 safe_string_copy(au->env_var, cur_argv, ENV_SIZE, FALSE);
  338.             }
  339.             else
  340.                fix_path(cur_argv+1);
  341.         }
  342.         else
  343.             fix_path(cur_argv);
  344.     }
  345.     if (au->output[0] != '\0')
  346.         close(creat(au->output, S_IWRITE));
  347. }
  348. /*░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░*/
  349. static void help(AU *au)
  350. {
  351.      au_printf(au, "%s",
  352.         "@?5Syntax: @?2AU@?H @?6action @?H[@?3options@?H] [@?1File Specs@?H]\n"
  353.         "\n"
  354.         "@?7Actions ***********************************************************************@?H\n"
  355.         "     @?6A@?Hdd       @?6DU@?Hpes      @?6P@?Hatch    @?6SW@?Heep    @?6W@?Hhatis\n"
  356.         "     @?6COM@?Hpare   @?6F@?Hind       @?6R@?Hedate   @?6T@?Hest     \n"
  357.         "     @?6C@?Honvert   @?6FIX@?Hcr      @?6S@?Hcan     @?6U@?Hnarc    \n"
  358.         "     @?6D@?Helete    @?6H@?Header     @?6SI@?Hze     @?6VE@?Hrsion  \n"
  359.         "     @?6DI@?Hr       @?6O@?Hrphans    @?6ST@?Hrip    @?6V@?Hiew     \n"
  360.         "@?7Global Options ****************************************************************@?H\n"
  361.         "     @?3-NE@?H    No Extra info displayed      @?3-C@?D<file>@?H     alternate Config file\n"
  362.         "     @?3-NC@?H    No Color                     @?3-O@?D<file|dev>@?H archiver Output\n"
  363.         "     @?3-S@?H     Simulate Mode                @?3-?@?H           specific help on action\n"
  364.         "     @?3-SD@?H[@?Dn@?H] process Sub Dirs (@?Dn@?H=depth)   @?3--@?H           stop scanning for options\n"
  365.         "     @?3-SE@?H    Show Executed Commands       @?3-E@?D<var>@?H      Result to variable @?Dvar@?H\n"
  366.         "     @?3-F@?H[@?3+@?H]@?D<file>@?H      additional file listing file(s) to update\n"
  367.         "@?7File Specs ********************************************************************@?H\n"
  368.         "     Standard wildcards    @?1*.*, *.zip, A*.*@?H\n"
  369.         "     Unix-Like wildcards   @?1*.??[0-9], [abc]*.lzh  [^f-h]*.zip@?H\n"
  370.         "     Arcmail               @?1$@?H\n"
  371.         "     Response (List) file  @?1@file@?H\n"
  372.         "     BBS List file         @?1-#@?H[@?1filespec@?H]\n");
  373.  
  374.     exit(0);
  375. }
  376. /*░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░*/
  377. static int AU_RunChoice(AU *au, char *choice, int argc, char *argv[])
  378. {
  379.     int ret_code, ret_code2;
  380.     int len = strlen(choice);
  381.     int (*func)(AU *, int, char *[]) = NULL;
  382.  
  383.     if (strnicmp(choice, "ADD", len)==0)
  384.         func = main_add;
  385.     else if (strnicmp(choice, "CONVERT", len)==0)
  386.         func = main_convert;
  387.     else if (strnicmp(choice, "COMPARE", len)==0)
  388.         func = main_compare;
  389.     else if (strnicmp(choice, "DELETE", len)==0)
  390.         func = main_delete;
  391.     else if (strnicmp(choice, "DIR", len)==0)
  392.         func = main_dir;
  393.     else if (strnicmp(choice, "DUPES", len)==0)
  394.         func = main_dupes;
  395.     else if (strnicmp(choice, "FIND", len)==0)
  396.         func = main_find;
  397.     else if (strnicmp(choice, "FIXCR", len)==0)
  398.         func = main_fixcr;
  399.     else if (strnicmp(choice, "HEADER", len)==0)
  400.         func = main_header;
  401.     else if (strnicmp(choice, "PATCH", len)==0)
  402.         func = main_patch;
  403.     else if (strnicmp(choice, "ORPHANS", len)==0)
  404.         func = main_orphan;
  405.     else if (strnicmp(choice, "REDATE", len)==0)
  406.         func = main_redate;
  407.     else if (strnicmp(choice, "SCAN", len)==0)
  408.         func = main_scan;
  409.     else if (strnicmp(choice, "SIZE", len)==0)
  410.         func = main_size;
  411.     else if (strnicmp(choice, "SWEEP", len)==0)
  412.         func = main_sweep;
  413.     else if (strnicmp(choice, "STRIP", len)==0)
  414.         func = main_strip;
  415.     else if (strnicmp(choice, "TEST", len)==0)
  416.         func = main_test;
  417.     else if (strnicmp(choice, "UNARC", len)==0 ||
  418.              strnicmp(choice, "EXTRACT", len)==0 ||
  419.              strnicmp(choice, "XTRACT", len)==0)
  420.         func = main_unarc;
  421.     else if (strnicmp(choice, "VIEW", len)==0 ||
  422.              strnicmp(choice, "LIST", len)==0)
  423.         func = main_view;
  424.     else if (strnicmp(choice, "VERSION", len)==0)
  425.         func = main_version;
  426.     else if (strnicmp(choice, "WHATIS", len)==0 ||
  427.              strnicmp(choice, "IDENT", len)==0)
  428.         func = main_whatis;
  429.     else if (strchr(choice,'?') != NULL)
  430.         help(au);
  431.     else
  432.     {
  433.         au_printf_error(au, "Unknown Action, AU -? for help\n");
  434.         exit(0);
  435.     }
  436.     ret_code = func(au, argc, argv);
  437.  
  438.     {
  439.         char temp[150];
  440.         if (au->env_var[0] != '\0' && au->env_cont[0] != '\0')
  441.         {
  442.             sprintf(temp, "%s=%s", au->env_var, au->env_cont);
  443.             alter_env(au, temp, au->env);
  444.         }
  445.     }
  446.  
  447.     ret_code2 = display_bad_arcs(au);
  448.     if (ret_code2 != 0)
  449.         return ret_code2;
  450.     else if (!au->no_extra)
  451.     {
  452.         if (func == main_test)
  453.             au_printf_c(au, 10, "All Archive files tested are OK\n");
  454.         else if (func == main_scan)
  455.             au_printf_c(au, 10, "All Archive files scanned are OK\n");
  456.     }
  457.     return ret_code;
  458. }
  459. /*░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░*/
  460. int main(int argc, char *argv[], char *env[])
  461. {
  462.     _new_handler = heapProblem;
  463.  
  464.     AU *au = new AU(argv, env, farcoreleft());
  465.     glob_au = au;
  466.  
  467.     if (argc < 2)
  468.     {
  469.         au_printf(au, VERSION);
  470.         help(au);
  471.     }
  472.  
  473.     parse_comm_line(au, argc-2, argv+2);
  474.  
  475.     if (!au->no_extra)
  476.     {
  477.         au_printf(au, VERSION);
  478.         if (au->simulate)
  479.             au_printf_c(au, 15, "(Simulation Mode)\n");
  480.     }
  481.     atexit(clean_up);
  482.     set_ctrl_brk();
  483.  
  484.     return AU_RunChoice(au, argv[1], argc-2, argv+2);
  485. }
  486.